---
sidebar_position: 1
---


# 什么是Semantic Kernel?

Semantic Kernel是一个开源的SDK，可以让您轻松构建可以调用现有代码的代理。作为一个高度可扩展的SDK，您可以使用Semantic Kernel与[OpenAI](https://platform.openai.com/docs/)、[Azure OpenAI](https://azure.microsoft.com/products/cognitive-services/openai-service/)、[Hugging Face](https://huggingface.co/)等模型一起使用！通过将现有的C#、Python和Java代码与这些模型结合起来，您可以构建能够回答问题和自动化流程的代理。

## Semantic Kernel位于代理堆栈的中心

![Copilot stack 与业务流程层在中间](https://learn.microsoft.com/zh-cn/semantic-kernel/media/copilot-stack.png)

在Kevin Scott的演讲《AI Copilot时代》中，他演示了微软如何利用由AI模型和插件组成的堆栈来驱动其[Copilot系统](https://www.youtube.com/watch?v=E5g20qmeKpg)。在这个堆栈的中心是一个AI编排层，它允许微软将AI模型和插件结合在一起，为用户创建全新的体验。

为了帮助开发人员在AI插件之上构建他们自己的Copilot体验，我们发布了Semantic Kernel，这是一个轻量级的开源SDK，可以让您将插件（即您现有的代码）与AI编排在一起。使用Semantic Kernel，您可以在自己的应用程序中利用驱动微软Copilot的相同AI编排模式。

提示

如果您有兴趣看到Copilot堆栈的示例（其中Semantic Kernel位于其中心），请查看[Project Miyagi](https://github.com/Azure-Samples/miyagi)。Project Miyagi重新构想了在Azure顶部设计、开发和部署智能应用程序的最新AI服务和工具。

## 为什么要使用诸如Semantic Kernel的SDK？

今天的AI模型可以轻松为用户生成消息和图像。虽然在构建简单的聊天应用程序时这是有帮助的，但要构建完全自动化的AI代理，以自动化业务流程并赋予用户更多能力，这还不够。为此，您需要一个框架，可以接收这些模型的响应，并使用它们调用现有的代码来*真正*做一些有意义的事情。

通过Semantic Kernel，我们实现了这一点。我们创建了一个SDK，可以让您轻松地将您的现有代码描述给AI模型，以便它们可以请求调用它们。之后，Semantic Kernel会将模型的响应转换为对您代码的调用。

要了解这是如何工作的，让我们构建一个简单的AI代理，可以打开和关闭灯泡。

### 换一个灯泡需要多少代理?

假设您希望一个AI代理能够打开和关闭灯泡。在真实的业务场景中，您可能希望AI执行更复杂的任务，比如发送电子邮件、更新数据库等，但即使在这些情况下，您仍然会遵循相同的步骤。

首先，您需要能够更改灯泡状态的代码。使用几行C#代码就可以很容易地完成这项任务。下面我们创建一个`LightPlugin`类，其中包含两个方法，`GetState`和`ChangeState`。

```csharp
public class LightPlugin
{
    public bool IsOn { get; set; } = false;

#pragma warning disable CA1024 // 在适当的地方使用属性
    [KernelFunction]
    [Description("Gets the state of the light.")]
    public string GetState() => IsOn ? "on" : "off";
#pragma warning restore CA1024 // 在适当的地方使用属性

    [KernelFunction]
    [Description("Changes the state of the light.'")]
    public string ChangeState(bool newState)
    {
        this.IsOn = newState;
        var state = GetState();

        //将状态打印到控制台
        Console.WriteLine($"[Light is now {state}]");

        return state;
    }
}
```

请注意，我们在方法上添加了一些属性，`[KernelFunction]`和`[Description]`。每当您希望AI调用您的代码时，您需要首先向AI描述它，以便它知道如何*实际*使用它。在这种情况下，我们描述了两个函数，`GetState`和`ChangeState`，以便AI可以请求调用它们。

现在我们有了我们的代码，现在需要将它提供给AI。这就是Semantic Kernel发挥作用的地方。使用Semantic Kernel，我们可以创建一个包含所有必要信息的单个`Kernel`对象，以将我们的代码与AI编排。为此，我们将创建一个新的`Kernel`对象，并传递我们的`LightPlugin`类和我们想要使用的模型：

```csharp
var builder = Kernel.CreateBuilder()
                    .AddAzureOpenAIChatCompletion(modelId, endpoint, apiKey);
builder.Plugins.AddFromType<LightPlugin>();
Kernel kernel = builder.Build();
```

现在我们有了一个内核，我们可以使用它来创建一个代理，每当需要时都会调用我们的代码。让我们使用`while`循环模拟一次来回的聊天：

```csharp
// 创建聊天记录
var history = new ChatHistory();

// 获取聊天完成服务
var chatCompletionService = kernel.GetRequiredService<IChatCompletionService>();

// 开始对话
Write("User > ");
string? userInput;
while ((userInput = ReadLine()) != null)
{
    // 添加用户输入
    history.AddUserMessage(userInput);

    // 启用自动调用功能
    OpenAIPromptExecutionSettings openAIPromptExecutionSettings = new()
    {
        ToolCallBehavior = ToolCallBehavior.AutoInvokeKernelFunctions
    };

    // 获得AI的响应
    var result = await chatCompletionService.GetChatMessageContentAsync(
        history,
        executionSettings: openAIPromptExecutionSettings,
        kernel: kernel);

    // 打印结果
    WriteLine("Assistant > " + result);

    // 将座席的消息添加到聊天记录中
    history.AddMessage(result.Role, result.Content ?? string.Empty);

    // 再次获得用户输入
    Write("User > ");
}
```

运行这些代码后，您应该能够与您的AI代理进行对话：

控制台

```console
User > Hello
Assistant > Hello! How can I assist you today?
User > Can you turn on the lights
[Light is now on]
Assistant > I have turned on the lights for you.
```

虽然这只是一个简单示例，展示了您可以如何使用Semantic Kernel，但它很快展示了该SDK的强大之处，以及它有多么容易用于自动化任务。要使用其他AI SDK重新创建类似的体验，您很容易需要编写两倍于此的代码。

## Semantic Kernel使AI开发具有可扩展性

Semantic Kernel已经被设计成可以轻松使用[插件](https://learn.microsoft.com/zh-cn/semantic-kernel/create-plugins/)将现有代码添加到您的AI代理中。通过插件，您可以让您的代理能够通过调用现有的应用程序和服务与现实世界进行交互。这样，插件就像是您的AI应用的“手和臂”。

此外，Semantic Kernel的接口允许它灵活地集成任何AI服务。这是通过一组连接器来实现的，这些连接器使得可以轻松添加[记忆](https://learn.microsoft.com/zh-cn/semantic-kernel/memories/)和AI模型。这样，Semantic Kernel能够为您的应用程序添加一个模拟的“大脑”，您可以轻松地替换为更新更好的AI模型。

由于Semantic Kernel提供了连接器和[插件](https://learn.microsoft.com/zh-cn/semantic-kernel/create-plugins/)的可扩展性，您可以使用它来编排几乎任何现有的代码，而不会被锁定到特定的AI模型提供者。例如，如果您为OpenAI的ChatGPT构建了一堆插件，您可以使用Semantic Kernel来编排它们与其他提供者的模型，如Azure或Hugging Face。

![Semantic Kernel可以编排来自任何提供者的AI插件](https://learn.microsoft.com/zh-cn/semantic-kernel/media/mind-and-body-of-semantic-kernel.png)

作为开发人员，您可以单独使用Semantic Kernel的不同组件。例如，如果您*只是*需要一个对OpenAI和Azure OpenAI服务的抽象，您可以只使用SDK来运行手工制作的提示，但Semantic Kernel的*真正*力量来自将这些组件结合在一起。

## 开始使用Semantic KernelSDK

现在您已经知道了Semantic Kernel是什么，请跟随[开始使用](https://learn.microsoft.com/zh-cn/semantic-kernel/get-started/)链接来尝试它。在几分钟内，您就可以创建提示，并与现成的插件和本地代码进行链式连接。不久之后，您可以为您的应用程序添加嵌入式记忆，并从外部API中召唤更多的力量。